package org.iteam.commons.utils;

import java.math.BigDecimal;
import java.math.MathContext;
import java.text.DecimalFormat;

/**
 * 格式化 小数
 * 
 * @author 文科
 * 
 */
public class NumberUtil {

	/**
	 * 两个数相乘
	 * 
	 * @param numberOne
	 *            乘数
	 * @param numberTwo
	 *            被乘数
	 * @param length
	 *            保留小数点的位数
	 * @return
	 */
	public static String multiply(String numberOne, String numberTwo,
			Integer length) {
		if (numberOne == null || "".equals(numberOne)) {
			numberOne = "0";
		}
		if (numberTwo == null || "".equals(numberTwo)) {
			numberTwo = "0";
		}
		BigDecimal value1 = new BigDecimal(numberOne, MathContext.DECIMAL128);
		BigDecimal value2 = new BigDecimal(numberTwo, MathContext.DECIMAL128);
		return format(value1.multiply(value2) + "", length);
	}

	/**
	 * 两个数相乘
	 * 
	 * @param numberOne
	 *            乘数
	 * @param numberTwo
	 *            被乘数
	 * @return
	 */
	public static String multiply(String numberOne, String numberTwo) {
		return multiply(numberOne, numberTwo,
				MathContext.DECIMAL128.getPrecision());
	}

	/**
	 * 两个数的除法
	 * 
	 * @param numberOne
	 *            被除数
	 * @param numberTwo
	 *            除数
	 * @param length
	 *            保留小数点的位数
	 * @return
	 */
	public static String divide(String numberOne, String numberTwo,
			Integer length) {
		if (numberOne == null || "".equals(numberOne)) {
			numberOne = "0";
		}
		if (numberTwo == null || "".equals(numberTwo)) {
			numberTwo = "1";
		}
		BigDecimal value1 = new BigDecimal(numberOne, MathContext.DECIMAL128);
		BigDecimal value2 = new BigDecimal(numberTwo, MathContext.DECIMAL128);
		return format(value1.divide(value2, MathContext.DECIMAL128) + "",
				length);
	}

	/**
	 * 两个数的除法
	 * 
	 * @param numberOne
	 *            被除数
	 * @param numberTwo
	 *            除数
	 * @return
	 */
	public static String divide(String numberOne, String numberTwo) {
		return divide(numberOne, numberTwo,
				MathContext.DECIMAL128.getPrecision());
	}

	/**
	 * 两个数 的差
	 * 
	 * @param numberOne
	 *            被减数
	 * @param numberTwo
	 *            减数
	 * @param length
	 *            保留小数点的位数
	 * @return
	 */
	public static String subtract(String numberOne, String numberTwo,
			Integer length) {
		if (numberOne == null || "".equals(numberOne)) {
			numberOne = "0";
		}
		if (numberTwo == null || "".equals(numberTwo)) {
			numberTwo = "0";
		}
		BigDecimal value1 = new BigDecimal(numberOne, MathContext.DECIMAL128);

		BigDecimal value2 = new BigDecimal(numberTwo, MathContext.DECIMAL128);
		return format(value1.subtract(value2, MathContext.DECIMAL128) + "",
				length);
	}

	/**
	 * 两个数 的差
	 * 
	 * @param numberOne
	 *            被减数
	 * @param numberTwo
	 *            减数
	 * @return
	 */
	public static String subtract(String numberOne, String numberTwo) {
		return subtract(numberOne, numberTwo,
				MathContext.DECIMAL128.getPrecision());
	}

	/**
	 * 两个数的和
	 * 
	 * @param numberOne
	 * @param numberTwo
	 * @param length
	 *            保留小数点的位数
	 * @return
	 */
	public static String add(String numberOne, String numberTwo, Integer length) {
		return add(length, numberOne, numberTwo);
	}

	/**
	 * 多个数相加
	 * 
	 * @param length
	 *            保留小数点的位数
	 * @param strings
	 * @return
	 */
	public static String add(Integer length, String... strings) {
		BigDecimal sum = new BigDecimal("0", MathContext.DECIMAL128);
		for (String string : strings) {
			if (string != null && !"".equals(string)) {
				sum = sum.add(new BigDecimal(string, MathContext.DECIMAL128));
			}
		}
		return format(sum + "", length);
	}

	/**
	 * 多个数相加
	 * 
	 * @param strings
	 * @return
	 */
	public static String add(String... strings) {
		BigDecimal sum = new BigDecimal("0", MathContext.DECIMAL128);
		for (String string : strings) {
			if (string != null && !"".equals(string)) {
				sum = sum.add(new BigDecimal(string, MathContext.DECIMAL128));
			}
		}
		return format(sum + "", MathContext.DECIMAL128.getPrecision());
	}

	/**
	 * 将字符串格式的数字格式化
	 * 
	 * @param number
	 * @return
	 */
	public static BigDecimal formatToBigDecimal(String number) {
		if (number == null || "".equals(number)) {
			number = "0";
		}
		return new BigDecimal(number, MathContext.DECIMAL128);
	}

	/**
	 * 将字符串格式的数字格式化
	 * 
	 * @param number
	 * @param length
	 * @return
	 */
	public static BigDecimal formatToBigDecimal(String number, int length) {
		if (number == null || "".equals(number)) {
			number = "0";
		}
		if (length < 0) {
			length = 0;
		}
		return new BigDecimal(number, new MathContext(length));
	}

	/**
	 * 格式化 数字 当长度值小于0时 默认为两位小数
	 * 
	 * @param number
	 *            要格式化的数
	 * @param length
	 *            小数点后的长度
	 * @return
	 */
	public static String format(String number, Integer length) {
		if (number == null || "".equals(number)) {
			number = "0";
		}
		StringBuffer format = new StringBuffer("#");
		if (length > 0) {
			format.append(".");
			for (int i = 0; i < length; i++) {
				format.append("#");
			}
		} else if (length < 0) {
			format.append("#");
		}
		DecimalFormat DecimalFormat = new DecimalFormat(format.toString());
		return DecimalFormat.format(new BigDecimal(number,
				MathContext.DECIMAL128));
	}
}
